import { combineReducers } from 'redux';
import undoable, { includeAction } from 'redux-undo';
import counter from './counter';
import { INCREMENT_COUNTER, DECREMENT_COUNTER, UNDO_COUNTER, REDO_COUNTER } from '../actions';


// 高阶函数是函数式编程中的一个概念，它可以接收其他函数作为参数，然后返回一个新的函数。
// 高阶函数以及高阶组件都是为了增强函数或组件的功能而设计的。
// 一般情况下，生成的新函数或组件不会失去原有的功能。

// undoable是个高阶函数（Higher-Order Function), 这意味着可以使用函数作为它的参数，然后生成一个新的函数。

const rootReducer = combineReducers({
    counter: undoable(counter, {
        //filter用于指定需要过滤的action。这里只撤销和重做加/减action，也就是INCREMENT和DECREMENT。
        filter: includeAction([INCREMENT_COUNTER, DECREMENT_COUNTER]),
        //limit是次数限制，当撤销或者重做的次数超过这个指定值，将无法继续撤销或者重做。
        limit: 10,
        // debug用于设定是否调试代码，激活状态下会打印相关的信息。
        debug: true,
        //undotype和redotype是撤销和重做的action。如此一来，只需要触发撤销/重做的action便可以实现撤销/重做功能。
        undoType: UNDO_COUNTER,
        redoType: REDO_COUNTER
    })
});

// const rootReducer = combineReducers({counter});

export default rootReducer;
